|
Date : 9 mars 1990 Programme : RAPIDFILE V1.1 ( Version Francaise ) Outils : TURBO DEBUGER V1.5 et PCTOOLS Protection : MESSAGE DE PRESENTATION Soci�t� : ASHTON TATE + COMMANDE ELECTRONIQUE Fichier : RF.COM Temps pass� : Divers : Origine : ? Num�ro : 007 But: Enlever le message d'introduction de LA COMMANDE ELECTRONIQUE. Premi�res constatations: - Impossible de trouver un seul mot du message dans le fichier � l'aide de PCTOOLS. - Le programme ne se d�ssassemble pas avec SOURCER V2. - PERISCOPE se plante m�me avec RUN.COM. - On arrive avec QUAID � trouver entre quelle et quelle interruption le message complet s'affiche. - Il est impossible en mode pas � pas de s'arr�ter sur l'affichage du message aussi bien avec QUAID qu'avec TURBO DEBUGGER: d�s la premi�re ligne d'affichage le programme s'ex�cute enti�rement. - En faisant du pas a pas avec TD on s'apercoit que le code n'est jamais le m�me lorsqu'on passe une deuxi�me fois au m�me endroit! En fait souvent le programme saute au milieu d'une instruction ce qui modifie compl�tement le code qui suit! - Aucune interruption n'est utilis�e pour sortir les caract�res ( ni l'INT 21 ni l'INT 10 - cel� aurait �t� trop facile ). Tout laisse � supposer que l'on adresse directement la m�moire �cran. Ca promet. En essayant succ�ssivement plusieurs "manip" je m'apercois qu'en lancant le programme par F9 ( TD ) j'arrive � l'interrompre en faisant CONTROL BREAK. Et je me retrouve dans la boucle d'affichage! En me servant de F8 ( execution de sous-programme et d'INT ) ainsi que de F4 ( executer le programme jusqu'au curseur ) je m'apercois que tout se passe dans le CALL 363E ( CS:368F ): affichage d'une ligne � chaque fois. En 'd�cortiquant' le CALL 363E je tombe sur 3 autres CALL avant le RET. . . POP AX CALL 35A2 PUSH AX . CALL 368F ����>. . <��������ͻ . . � . . � CALL 1DF3 ; Lecture IN AL,03DA Ecriture OUT 03D8,AL . � . ; adresses registres de la carte graphique . � CALL 2106 ; Les lignes sont affich�es ici une par � ; une. � CALL 1E20 ; Ecriture adresse carte graphique OUT � ; 03D8,AL � . � . �� RET Le premier et le troisi�me CALL ne servent qu'� tester la carte vid�o pour n'envoyer les caract�res qu'en dehors d'un balayage ligne. ( Compatibilit� avec les premi�res cartes CGA et MONOCHROMES cel� �vite un d�chirement de l'image - Les cartes EGA/VGA n'ont pas ce d�faut. ) La premi�re id�e est de supprimer le CALL central...et cel� fonctionne parfaitement pour supprimer le message d'entr�. Mais chose curieuse on se retrouve avec un RAPIDFIL qui affiche des fen�tres vid�es de tout texte! Bravo l'id�e d'afficher tout ce qui ressemblait � un caract�re ASCII dans le soft � l'aide du m�me CALL est assez g�nial. Le CALL 2106 comporte une boucle qui tourne 80 fois ( 1 ligne de 80 caract�res ) 50h dans CX avec un LODSB ( load byte de DS:SI -> AL ) suivi d'un STOSW ( store word vers ES:DI ) et DI contient B800 cad l'adresse de la m�moire �cran. MOV CX,50 LODSB STOSW LOOP Donc ne pouvant pas modifier la sortie sans alt�rer la suite du programme, j'essaie de trouver d'ou vienne les caract�res. Je DUMP le contenu de DS:SI SI=341C et je "vois" effectivement la ligne apparaitre avant d'etre affich�e sur 80 caract�res � partir de DS:SI. A l'aide de l'instruction ALT-P je remonte le programme en sens inverse afin de localiser l'endroit d'ou la ligne est tir�e. Apr�s plusieurs essais je tombe sur un CALL 35A2 situ� avant mon CALL principal 36F8. En approffondissant le CALL 35A2 on voit qu'en fait le message et tout les textes du soft sont �parpill�s lettre par lettre dans le fichier. Le tout est reconstitu� ligne par ligne par 2 boucles imbriqu�es relativement complexes. J'ai sorti la routine pour la faire se d�rouler au pas � pas par VISIBLE COMPUTER 80286 et ainsi visualiser les registres et les diff�rentes zones m�moire. Les caract�res sont appel�s par groupe de 3,2,4,6,5 de n'importe quel endroit du fichier pour �tre mis bout � bout � partir de 341C. On remarque une chose int�rressante; avant l'appel du CALL 35A2 on charge AX ( POP ) et � la sortie du programme on le sauve sur la pile ( PUSH ). AX commence � la valeur 19h pour �tre incr�ment� ligne par ligne jusqu'� 2Eh. On retrouve donc les 25 lignes de l'�cran. Ne pouvant pas modifier les caract�res sous peine de modifier l'affichage de la suite du programme, l'id�e vient d'emp�cher la sortie ligne par ligne pendant les 25 premi�res lignes du programme Bonne id�e, mais le programme ne se d�ssassemblant pas il est impossible d'y rajouter du code � moins de jongler avec les HEADER, PSP, etc... Il ne reste donc plus qu'� trouver une zone non utilis�e. ( zone DATA ) Avec PCTOOLS on s'apercoit que le message d'origine - non crypt� - est toujours pr�sent dans le fichier.( Message en Anglais d'ASHTON TATE ) Un essai est vite fait en remplissant de "20" toute une zone et d'essayer � nouveau le soft pour s'assurer qu'il fonctionne toujours. C'est le cas! Je remplace donc le CALL 35A2 par un CALL 0300 qui saute dans ma zone de donn�es non utilis�es. J'y place un RETour et je v�rifie si tout continue de fonctionner comme avant. Voil� le plus dur est fait, maintenant ce n'est plus qu'une question de quelques instructions en assembleur. . . . 3755 POP AX 3756 CALL 0300 �������> CMP AX,002E ;je compare AX � 2Eh 3759 PUSH AX <������ͻ JBE 30C ;si plus petit ou �gal saut... . � MOV w[3757],FE49 ;remplace le CALL 0300 par le . � ;CALL d'origine en 35A2!.... . 30B �� RET ;retour . 30C � MOV DX,0400 ;ici routine d'affichage 30F � MOV AH,09 ;personnel. 311 � INT 21 ;sortie d'une chaine de 313 � MOV AH,06 ;caract�res. 315 � XOR AL,AL 317 � NOP 318 � NOP 319 �� RET Chaine personnelle en CS:0601h "Rapidfil version 1.1 modifi�" et CS:DX 0400h " 80 espaces " L'instruction MOV WORD PTR [3757],FE49 remet dans l'emplacement m�moire 3757 et 3758 ( word ) la valeur HEXA 49FE qui correspond � un saut relatif en 35A2. C'est � dire remet en place le saut originel du programme pour �viter que par la suite le programme ne soit perturb�. Sans cette petite rectification le soft se plante lorsqu'on rajoute un fichier � un autre d�j� en m�moire dans RF. Note: Pour entrer des nombres HEXA avec TD il faut soit les faires pr�c�der par 0 ou finir par h. Ceci seulement si le nombre contient des lettres HEXA ABCDEF. Voil� le travail......il ne reste plus qu'� r�p�ter la m�me chose pour les versions plus r�centes. M�thode pratique: 1) Avec PCTOOLS chercher la chaine: 2020202020202020BA01C8CDCDCDCDCDCD..... Et remplacer par ( en commencant par le premier 20 ) 3D2E00 ; Adresse 0300 h, c'est en fait la 7607 ; traduction des instructions ASM C706573749FE ; tap�es plus haut. C3 ; RET BA0004 B409 CD21 ; INT 21 B406 32C0 9090 ; NOP 2 fois C3 ; RET adresse 0319h ; Donc 26 octets � remplacer. 2) Rep�rer 6446696C6520206F... ( dfile on one computer...) Placer ici � partir de 64 sa propre chaine ASCII qui sera affich�e sur l'�cran � la place du message d'origine. A partir du premier octet (64) on dispose de 80 caract�res. Le premier caract�re inclu. 3) Rep�rer 6420415348544F4E.... ( d ASHTON-TATE...) Placer ici 80 espaces suivi d'un $ (24h). 4) Pour terminer rep�rer E849FE50AD93FF27430A5337 et changer les 2me et 3me octets par A7CB. ( CALL 0300 ) Freddy. |